package com.turbo.cloud.core.utils;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.turbo.cloud.core.base.PageDynamic;
import com.turbo.cloud.core.base.PageQuery;
import org.springframework.beans.BeanUtils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;

/**
 * 分页查询工具
 *
 * @author zhangluning
 */
public class PageUtil {
    /**
     * 查询PageQuery 实体
     *
     * @param pageQuery      分页查询实体
     * @param targetSupplier 目标对象供应方
     * @return T
     */
    public static <T extends Serializable> T getPageQueryParam(PageQuery<T> pageQuery, Supplier<T> targetSupplier) {
        T target = targetSupplier.get();
        return Objects.nonNull(pageQuery.getParam()) ? (T) pageQuery.getParam() : target;
    }

    /**
     * 查询PageQuery 实体
     *
     * @param page           分页查询实体
     * @param targetSupplier 目标对象供应方
     * @return T
     */
    public static <S extends Serializable, T extends Serializable> Page<T> toPageView(Page<S> page, Supplier<T> targetSupplier) {
        Page<T> pageView = new Page<>();
        if (Objects.nonNull(page)) {
            BeanUtils.copyProperties(page, pageView);

            List<T> pageRecords = new ArrayList<>();
            pageView.setRecords(pageRecords);

            BeanListUtils.copyList(page.getRecords(), pageView.getRecords(), targetSupplier);
        }
        return pageView;
    }

    /**
     * 查询PageQuery 实体
     *
     * @param page    分页查询实体
     * @param columns 表列
     * @return T
     */
    public static <T> PageDynamic<T> toPageDynamicView(Page<T> page, List<PageDynamic.ColumnStyle> columns) {
        PageDynamic<T> pageDynamicView = new PageDynamic<>();
        if (Objects.nonNull(page)) {
            BeanUtils.copyProperties(page, pageDynamicView);
            pageDynamicView.setRecords(page.getRecords());
            pageDynamicView.setColumns(columns);
        }
        return pageDynamicView;
    }
}
